Skip to content

TypeSchema: Split dependency types for specializations and profiles#118

Merged
ryukzak merged 9 commits intomainfrom
split-dependency-types
Mar 24, 2026
Merged

TypeSchema: Split dependency types for specializations and profiles#118
ryukzak merged 9 commits intomainfrom
split-dependency-types

Conversation

@ryukzak
Copy link
Copy Markdown
Collaborator

@ryukzak ryukzak commented Mar 23, 2026

Dependency type split

  • SpecializationTypeSchema.dependencies narrowed from TypeIdentifier[] to Identifier[] — nested identifiers are filtered out
  • ProfileTypeSchema.dependencies stays TypeIdentifier[] — keeps nested identifiers
  • Split extractDependencies into two functions:
    • extractDependencies — filters out nested, returns Identifier[] (for specializations)
    • extractProfileDependencies — keeps nested, returns TypeIdentifier[] (for profiles)
    • Shared collectRawDeps helper extracts the common logic
  • Split transformFhirSchema into profile/specialization branches with correct dep extraction
  • Split treeShakeTypeSchema dependency recalculation by schema kind

Specialization dependencies no longer include nested identifiers:

// Before
dependencies: [
    { kind: "resource", url: ".../CodeSystem" },
    { kind: "nested", url: ".../CodeSystem#concept" },
]

// After (specialization)
dependencies: [
    { kind: "resource", url: ".../CodeSystem" },
]

// After (profile) — nested kept
dependencies: [
    { kind: "resource", url: ".../CodeSystem" },
    { kind: "nested", url: ".../CodeSystem#concept" },
]

Type safety improvements

  • Replace schema.identifier.kind checks with type predicates (isResourceTypeSchema, isSpecializationTypeSchema, isLogicalTypeSchema)
  • Remove as unknown as SpecializationTypeSchema casts in writers — NestedTypeSchema is structurally assignable
  • Remove as unknown as TypeSchema casts for nested schemas
  • Replace as ProfileIdentifier cast with assert(isProfileIdentifier(...))
  • Remove dead isNestedIdentifier/kind === "nested" branches in TS writer
  • Make groupByPackages generic to preserve input types, removing as Record<...> casts
  • Widen mutableSelectFields/mutableIgnoreFields to accept SpecializationTypeSchema | ProfileTypeSchema
  • Make concatIdentifiers generic (<T extends TypeIdentifier = TypeIdentifier>)
  • Narrow extractDependencies param to Identifier, extractProfileDependencies to ProfileIdentifier
  • Narrow base to Identifier | undefined in transformFhirSchema with assert
  • Use const arrow style for collectRawDeps, extractDependencies, extractProfileDependencies

Bug fix: constrained choice on nested types

  • Add nestedIndex fallback in resolveByUrl so constrainedChoice resolves nested types
  • Blood Pressure profile component slices now correctly detect value[x]valueQuantity constraint:
// Before — all value[x] variants still exposed
export type Observation_bp_Component_SystolicBPSliceFlat = Omit<ObservationComponent, "code">;

// After — choice variants stripped, intersected with constrained type
export type Observation_bp_Component_SystolicBPSliceFlat =
    Omit<ObservationComponent, "code" | "value" | "valueQuantity" | ...> & Quantity;

…ier[] for profiles

- SpecializationTypeSchema.dependencies is now Identifier[] (no nested)
- ProfileTypeSchema.dependencies remains TypeIdentifier[] (includes nested)
- Extract collectRawDeps helper; extractDependencies filters nested,
  extractProfileDependencies keeps them
- Split transformFhirSchema into profile/specialization branches
- Split treeShakeTypeSchema dependency recalculation by schema kind
- Add nestedIndex fallback in resolveByUrl for constrainedChoice
- Remove dead isNestedIdentifier/kind=nested branches in TS writer
- Add casts in Python, C#, tree-shake for NestedTypeSchema boundaries
@ryukzak ryukzak force-pushed the split-dependency-types branch from 4be9052 to a0a5650 Compare March 23, 2026 15:30
ryukzak added 8 commits March 23, 2026 16:34
- Replace schema.identifier.kind checks with isResourceTypeSchema,
  isSpecializationTypeSchema, isLogicalTypeSchema predicates
- Make groupByPackages generic to preserve input type
- Widen mutableSelectFields/mutableIgnoreFields to accept ProfileTypeSchema
- Remove all as unknown as SpecializationTypeSchema/TypeSchema casts
  (NestedTypeSchema is structurally assignable to SpecializationTypeSchema)
@ryukzak ryukzak merged commit dab78af into main Mar 24, 2026
31 checks passed
@ryukzak ryukzak deleted the split-dependency-types branch March 24, 2026 11:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant